package com.tutos.ui.monitor;

import java.util.HashMap;
import java.util.Map;

import javax.inject.Inject;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.vaadin.teemu.ratingstars.RatingStars;

import com.tutos.dao.CalificacionesEstudianteDAO;
import com.tutos.dao.EstudianteDAO;
import com.tutos.dao.MonitorDAO;
import com.tutos.model.CalificacionesEstudiante;
import com.tutos.model.Estudiante;
import com.tutos.model.Monitor;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.ui.Component;
import com.vaadin.ui.VerticalLayout;


public class Calificacion {

	//Data objects
	private Monitor monitor;
	private MonitorDAO monitorDAO;
	private Estudiante estudiante;
	private EstudianteDAO estudianteDAO;
	private CalificacionesEstudianteDAO calificacionesDAO;
	
	//Interface model
	private static Map<Integer, String> valueCaptions = new HashMap<Integer, String>(
            5);

    static {
        valueCaptions.put(1, "Nada recomendable");
        valueCaptions.put(2, "Regular");
        valueCaptions.put(3, "Aceptable");
        valueCaptions.put(4, "Bueno");
        valueCaptions.put(5, "Excelente");
    }
    
    //Interface objects
    private VerticalLayout layout;
	private RatingStars calificacionGlobal, calificacionDada;
	
	@Inject
	public Calificacion(MonitorDAO monitorDAO, EstudianteDAO estudianteDAO,
			CalificacionesEstudianteDAO calificacionesDAO){
		this.monitorDAO = monitorDAO;
		this.estudianteDAO = estudianteDAO;
		this.calificacionesDAO = calificacionesDAO;
		layout = new VerticalLayout();
		initRatingStars();
	}
	
	private void initRatingStars(){
		calificacionGlobal = new RatingStars();
		calificacionGlobal.setDescription("Calificación global: ");
		calificacionGlobal.setEnabled(false);
		initRatingComponent(calificacionGlobal);
		
		calificacionDada = new RatingStars();
		calificacionDada.setDescription("Calificación dada: ");
		calificacionDada.setReadOnly(false);
		initRatingComponent(calificacionDada);
		
		calificacionDada.addListener(new Property.ValueChangeListener() {
			
			/**
			 * Cambiar los datos en la interfaz inmeditamente se producen cambios,
			 * y guardar estos en la BD
			 */
			private static final long serialVersionUID = 1L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				CalificacionesEstudiante cal = calificacionesDAO.getCalificacionDada(estudiante, monitor);
				
				
				if(cal == null){
					
					cal = new CalificacionesEstudiante();
					cal.setMonitor(monitor);
					cal.setEstudiante(estudiante);
					
					calificacionesDAO.insertEntity(cal);
				}
				
				cal.setCalificacion(Double.valueOf(event.getProperty().getValue().toString()));
				calificacionesDAO.updateEntity(cal);
				updateData();
			}
		});
		

	}
	
	private void initRatingComponent(RatingStars rts){
		rts.setMaxValue(5);
		rts.setAnimated(true);
		rts.setImmediate(true);
		
		rts.setValueCaption(valueCaptions.values().toArray(new String[5]));
	}
	
	public void init(){
		Subject currentUser = SecurityUtils.getSubject();
		currentUser.getSession().getAttribute("username");
		setMonitor(monitorDAO.getMonitorByCorreo((String) currentUser.getSession().getAttribute("username")));
	
		layout.removeAllComponents();
		layout.addComponent(calificacionGlobal);
	}
	

	public void init(Monitor monitor){
		Subject currentUser = SecurityUtils.getSubject();
		currentUser.getSession().getAttribute("username");
		Estudiante estudiante = estudianteDAO.getEstudianteByCorreo((String) currentUser.getSession().getAttribute("username"));
		setMonitor(monitor);
		
		if(this.estudiante != estudiante){
			setEstudiante(estudiante);
			layout.removeAllComponents();
			layout.addComponent(calificacionGlobal);
			layout.addComponent(calificacionDada);
		}
		CalificacionesEstudiante cal = calificacionesDAO.getCalificacionDada(estudiante, monitor);
		calificacionDada.setValue(cal == null ? 0: cal.getCalificacion());
	}
	
	public void setMonitor(Monitor monitor){
		if(this.monitor!=monitor){
			System.out.println(monitor.getId());
			this.monitor=monitor;
			calificacionGlobal.setValue(calificacionesDAO.getCalificacionGlobal(monitor));
		}
	}
	
	private void setEstudiante(Estudiante estudiante){
		if(this.estudiante !=estudiante){
			this.estudiante=estudiante;
			CalificacionesEstudiante cal = calificacionesDAO.getCalificacionDada(estudiante, monitor);
			calificacionDada.setValue(cal == null ? 0: cal.getCalificacion());
		}
	}
	
	private void updateData() {
		
		calificacionGlobal.setValue(calificacionesDAO.getCalificacionGlobal(monitor));
		CalificacionesEstudiante cal = calificacionesDAO.getCalificacionDada(estudiante, monitor);
		calificacionDada.setValue(cal == null ? 0: cal.getCalificacion());
	}
	
	public Component getComponent(){
		return layout;
	}
}
